Date : 11 aout 1991
Protection : MOT DE PASSE
Programme : XENOMORPHE
Outils : SOFT-ICE V2.50
Fichier : XENO.EXE
Temps pass� : 1 HEURE
Soci�t� : PANDORA
Divers : CREATION DE FRED6.COM
: et le septi�me ce week-end !
Origine : INDONESIE
Num�ro : 126
Une protection disquette plus une protection mot de passe !
Je d�cide de m'attaquer � la protection mot de passe pour commencer.
Les caract�res sont demand�s par l'INT 21 sous-fonction 07.
Le test de la touche ENTER se fait en:
36D0:8807 CD21 INT 21
36D0:8809 3C0D CMP AL,0D
36D0:880B 7456 JZ 8863
Premi�re constatation; ce programme se modifie largement lui-m�me
en fonction de la r�ponse. ( modification par des MOV CS:[xxxx],yyyy )
Si on ne r�pond rien � la demande de mot de passe ( touche ENTER seule )
on sort du programme imm�diatement car une instruction CWD fait un
" pont " entre deux sous-programmes. ( le deuxi�me sous-programme sort
vers le DOS ).
Et dans le cas o� on rentre au moins un caract�re avant d'appuyer sur
ENTER on se trouve avec une instruction RET � cet endroit:
36D0:88AF 750A JNZ 88BB ; � supprimer par un XOR BX,BX ( 33DB )
36D0:88B1 81C3613F ADD BX,3F61 ; on doit retrouver 3F61 en BX
36D0:88B5 2E89BF7502 MOV CS:[BX+0275],DI
36D0:88BA C3 RET ; Ici on trouve un 99 ( CWD ) si on ne
; tape pas au moins un caract�re.
Le contenu de BX est test� juste avant le saut conditionnel en 88AF.
Le contenu de BX doit �tre � zero pour que le programme fonctionne
correctement et que l'on passe par 88B1 afin de recharger BX avec 3F61.
Donc deux op�rations � effectuer:
1) forcer le saut en 88AF pour qu'il passe en 88B1.
2) s'assurer que le contenu de BX contienne zero avant l'addition ou
bien transformer le ADD BX,3F61 en MOV BX,3F61.
Il faut �videment que le nombre des octets composant les nouvelles
instructions soit identique � celui des instructions � remplacer.
Une solution �l�gante permet de faire d'une pierre deux coups puisqu'en
pla�ant un XOR BX,BX � la place du saut JNZ 88BB je supprime le saut
et je mets le contenu de BX � zero !
Un autre probl�me survient; la chaine d'octet fait parti de la
protection disquette et ne se trouve donc nul part en clair.
Il ne reste plus qu'� appliquer la solution du d�tournement d'IT.
L'INT 21 sous-fonction 07 ( attente de caract�re vanant du clavier )
est appel�e juste avant la demande du mot de passe.
FRED6.COM est vite cr�e puisqu'il suffit de prendre un ancien FRED.COM
et de modifier la valeur de IP cherch�, le mot � trouver � cette
position et le nouveau mot � y mettre ( remplacer 750A par 33DB ).
; PATCH POUR LE PROGRAMME XENOMORPHE
; FREDDY_SOFT
code segment
org 100h
assume cs:code
start: jmp installe ; On va installer la routine r�sidente...
cr equ 0dh
lf equ 0ah
flag equ 07h ; Contenu de AH devant �tre test�.
adr_ip equ 88afh ; En CS:88af il suffit de mettre 33db. ( XOR BX,BX )
patch equ 0db33h ; � mettre � la place de 750A en CS:88afh
; Note: toujours inverser l'octet fort et faible
; ....Standard INTEL !
instok db cr,lf,' D�tournement de l',39,'INT 21 sous-fonction 07'
db cr,lf
db ' ....FREDDY_SOFT....','$'
drap db 0,0
elimine db cr,lf,'J',39,'ai en principe tout remis en l',39,'�tat....'
db cr,lf,'$'
int21 label dword ; sauvegarde des adresses SEG:OFF de l'INT21 d'origine
i40off db 0,0 ; OFFSET
i40seg db 0,0 ; SEGMENT
tsrint40 proc far
jmp short apr�s_id
db 'FR' ; On intercalle au d�but du code un identificateur
apr�s_id: sti ; qui permettra de savoir si le programme est l� !
nop
push ds
push es
push di
push si
push dx
push cx
push bx
push ax
cmp byte ptr [drap],1 ; Si 1 on devient transparent.
jz suite ; Saut � l'INT 21 toutes fonctions valid�es.
cmp ah,flag ; AH = 07.
jnz suite ; Si non on traite les INT 21 normalement.
mov ax,sp ; On sauve SP dans un registre, ici AX.
mov cx,20 ; On essaie une vingtaine de fois...
incr: pop ds ; Pour trouver le bon segment CS...
dec cx
jz s ; Si au bout de vingt fois on a pas r�ussi on sort...
cmp word ptr ds:[adr_ip],0a75h ; en CS:88AF on a 750A.
jnz incr
mov word ptr ds:[adr_ip],patch
mov byte ptr [drap],1h
s: mov sp,ax ; On remet SS:SP d'origine.
suite: pop ax ; On restaure tous les registres
pop bx
pop cx
pop dx
pop si
pop di
pop es
pop ds
pushf ; Pushf et puis un CALL pour appeler l'INT 21 ceci
cli ; pour simuler une instruction INT.
call int21 ; Appel de l'INT21 officielle.
fin: sti
ret 2 ; et on revient
tsrint40 endp
eor:
; ROUTINE D'INSTALLATION
installe: mov ax,3521h
int 21h
cmp word ptr es:[bx+2],'RF' ; On teste la pr�sence de la signature.
je away ; si pr�sent on d�sinstalle.
mov ax,cs ; CS --> DS
mov ds,ax ; DS = CS
mov ax,3521h ; on detourne l'int 21h.
int 21h ; sous-fonction 35.
mov word ptr [i40off],bx ; L'offset se retrouve en BX.
mov i40seg,es ; Le segment en ES.
mov ax,2521h ; Et on met l'ad. du resident
mov dx,offset tsrint40 ; sous-fonction 25 dont SEG:OFF se
int 21h ; trouve en DX <---( tsrint40 ).
mov dx,offset instok ; Offset du message de fin.
mov ah,09 ; Sorti du message...
int 21h
mov ah,07 ; Attente d'un caract�re au clavier.
int 21h
mov dx,eor-start+100h+15 ; On r�serve la m�moire qui doit rester
mov cl,4 ; en r�sident: DEBUT code - FIN code +
shr dx,cl ; 100h + 15. ( 100h car les zones data
mov al,0 ; sont plac�es de 0 � 100h dans un com.
; Puis d�calage de 4 � droite pour avoir
; le r�sultat en nombre de paragraphe
; + 1 ( ou + 15 comme ci-dessus ).
mov ah,31h ; Sortie et reservation
int 21h ; de la m�moire.
away: mov dx,word ptr es:i40off ; Restauration de OFF:SEG de l'INT 21
mov ax,word ptr es:i40seg ; d'origine.
mov ds,ax
mov ax,2521h ; Set vecteur de l' INT 21
int 21h
mov bx,es
mov es,es:[2ch]
mov ah,49h ; On lib�re la m�moire.
int 21h
mov es,bx
mov ah,49h
int 21h
push cs ; Mettre CS dans DS
pop ds
mov dx,offset elimine ; pointe sur d�but du message.
xor al,al
mov ah,9
int 21h ; Sortir message.
mov ah,4ch
int 21h ; On revient au DOS.
code ends
end start
|